/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.opt.listenomcampagne.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.opt.listenomcampagne.builder.DTONomIdentifiantBuilder;
import fr.generali.accueilclient.opt.listenomcampagne.builder.DTONomIdentifiantSetBuilder;
import fr.generali.accueilclient.opt.listenomcampagne.builder.DTONomObjectifsBuilder;
import fr.generali.accueilclient.opt.listenomcampagne.builder.DTONomProduitBuilder;
import fr.generali.accueilclient.opt.listenomcampagne.om.ICritereIdentifiant;
import fr.generali.accueilclient.opt.listenomcampagne.om.ICritereNomCampagne;
import fr.generali.accueilclient.opt.listenomcampagne.om.ICritereNomCampagneIdentifiant;
import fr.generali.accueilclient.opt.listenomcampagne.om.INomIdentifiant;
import fr.generali.accueilclient.opt.listenomcampagne.om.INomIdentifiantSet;
import fr.generali.accueilclient.opt.listenomcampagne.om.INomObjectifs;
import fr.generali.accueilclient.opt.listenomcampagne.om.INomProduit;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoCritereIdentifiant;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoCritereNomCampagne;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoCritereNomCampagneIdentifiant;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoNomIdentifiant;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoNomIdentifiantSet;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoNomObjectifs;
import fr.generali.relationclient.marketing.opt.listenomcampagne.DtoNomProduit;
import fr.generali.relationclient.marketing.opt.listenomcampagne.builder.DtoCritereIdentifiantBuilder;
import fr.generali.relationclient.marketing.opt.listenomcampagne.builder.DtoCritereNomCampagneBuilder;
import fr.generali.relationclient.marketing.opt.listenomcampagne.builder.DtoCritereNomCampagneIdentifiantBuilder;

/**
 * @author Holmes Kelly
 */

@Component("listeNomCampagneMapper")
public class ListeNomCampagneMapper {

    /**
     * @param critereNomCampagneIdentifiant critereNomCampagneIdentifiant
     * @return DtoCritereNomCampagneIdentifiant
     */
    public DtoCritereNomCampagneIdentifiant mapperCritereNomCampagneIdentifiant2DtoCritereNomCampagneIdentifiant(
                    ICritereNomCampagneIdentifiant critereNomCampagneIdentifiant) {

        DtoCritereNomCampagneIdentifiant dtoCritereNomCampagneIdentifiant = null;

        if (critereNomCampagneIdentifiant != null) {

            List<DtoCritereIdentifiant> buildListeDtoCritereIdentifiantProduits =
                            buildListeDtoCritereIdentifiant(critereNomCampagneIdentifiant.getListeCibleProduit());
            List<DtoCritereIdentifiant> buildListeDtoCritereIdentifiantObjectifs =
                            buildListeDtoCritereIdentifiant(critereNomCampagneIdentifiant.getListeObjectifCampagne());
            List<DtoCritereIdentifiant> buildListeDtoCritereIdentifiantStatut =
                            buildListeDtoCritereIdentifiant(critereNomCampagneIdentifiant.getListeStatut());

            DtoCritereNomCampagneIdentifiantBuilder buildCritereNomCampagneIdentifiant =
                            DtoCritereNomCampagneIdentifiantBuilder.dtoCritereNomCampagneIdentifiant()
                                            .buildIdIntermediaire(critereNomCampagneIdentifiant.getIdIntermediaire())
                                            .buildNomCampagne(critereNomCampagneIdentifiant.getNomCampagne());

            if (CollectionUtils.isNotEmpty(buildListeDtoCritereIdentifiantObjectifs)) {

                buildCritereNomCampagneIdentifiant.buildListeObjectifCampagne(buildListeDtoCritereIdentifiantObjectifs);
            }

            if (CollectionUtils.isNotEmpty(buildListeDtoCritereIdentifiantProduits)) {

                buildCritereNomCampagneIdentifiant.buildListeCibleProduit(buildListeDtoCritereIdentifiantProduits);
            }

            if (CollectionUtils.isNotEmpty(buildListeDtoCritereIdentifiantStatut)) {

                buildCritereNomCampagneIdentifiant.buildListeStatutCampagne(buildListeDtoCritereIdentifiantStatut);
            }

            dtoCritereNomCampagneIdentifiant = buildCritereNomCampagneIdentifiant.build();
        }

        return dtoCritereNomCampagneIdentifiant;
    }

    /**
     * @param critereNomCampagne critereNomCampagne
     * @return DtoCritereNomCampagne
     */
    public DtoCritereNomCampagne mapperCritereNomCampagne2DtoCritereNomCampagne(ICritereNomCampagne critereNomCampagne) {

        DtoCritereNomCampagne dtoCritereNomCampagne = null;

        if (critereNomCampagne != null) {

            dtoCritereNomCampagne =
                            DtoCritereNomCampagneBuilder.dtoCritereNomCampagne()
                                            .buildIdIntermediaire(critereNomCampagne.getIdIntermediaire())
                                            .buildNomCampagne(critereNomCampagne.getNomCampagne()).build();
        }

        return dtoCritereNomCampagne;
    }

    /**
     * @param listDtoNomIdentifiant listDtoNomIdentifiant
     * @return list INomIdentifiant
     */
    public List<INomIdentifiant> mapperListerNomIdentifiant2INomIdentifiant(
                    List<DtoNomIdentifiant> listDtoNomIdentifiant) {

        return buildListeINomIdentifiant(listDtoNomIdentifiant);
    }

    /**
     * @param dtoNomIdentifiantSet dtoNomIdentifiantSet
     * @return INomIdentifiantSet
     */
    public INomIdentifiantSet mapperDtoNomIdentifiantSet2INomIdentifiantSet(DtoNomIdentifiantSet dtoNomIdentifiantSet) {

        INomIdentifiantSet nomIdentifiantSet = null;

        if (dtoNomIdentifiantSet != null) {

            List<INomIdentifiant> buildListeCibleProduits =
                            buildListeINomIdentifiant(dtoNomIdentifiantSet.getListeCibleProduit());
            List<INomIdentifiant> buildListeNomCampagne =
                            buildListeINomIdentifiant(dtoNomIdentifiantSet.getListeNomCampagne());
            List<INomIdentifiant> buildListeObjectif =
                            buildListeINomIdentifiant(dtoNomIdentifiantSet.getListeObjectifCampagne());
            List<INomIdentifiant> buildListeStatut =
                            buildListeINomIdentifiant(dtoNomIdentifiantSet.getListeStatutCampagne());

            nomIdentifiantSet =
                            DTONomIdentifiantSetBuilder.dTONomIdentifiantSet()
                                            .buildListeCibleProduit(buildListeCibleProduits)
                                            .buildListeNomCampagne(buildListeNomCampagne)
                                            .buildListeObjectifCampagne(buildListeObjectif)
                                            .buildListeStatutCampagne(buildListeStatut).build();
        }

        return nomIdentifiantSet;
    }

    /**
     * @param listeCritereIdentifiants liste ICritereIdentifiant
     * @return liste DtoCritereIdentifiant
     */
    private List<DtoCritereIdentifiant> buildListeDtoCritereIdentifiant(
                    List<ICritereIdentifiant> listeCritereIdentifiants) {

        List<DtoCritereIdentifiant> listeDtoCritereIdentifiants = null;

        if (CollectionUtils.isNotEmpty(listeCritereIdentifiants)) {

            listeDtoCritereIdentifiants = new ArrayList<DtoCritereIdentifiant>();

            CollectionUtils.collect(listeCritereIdentifiants,
                            getTransformerICritereIdentifiant2DtoCritereIdentifiant(), listeDtoCritereIdentifiants);
        }

        return listeDtoCritereIdentifiants;

    }

    /**
     * @return transformer ICritereIdentifiant->DtoCritereIdentifiant
     */
    private Transformer getTransformerICritereIdentifiant2DtoCritereIdentifiant() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                ICritereIdentifiant critereIdentifiant = ICritereIdentifiant.class.cast(input);

                DtoCritereIdentifiant dtoCritereIdentifiant =
                                DtoCritereIdentifiantBuilder.dtoCritereIdentifiant()
                                                .buildIdentifiant(critereIdentifiant.getIdentifiant()).build();

                return dtoCritereIdentifiant;
            }
        };

        return transformer;
    }

    /**
     * @param listeDtoNomIdentifiants liste DtoNomIdentifiant
     * @return liste INomIdentifiant
     */
    private List<INomIdentifiant> buildListeINomIdentifiant(List<DtoNomIdentifiant> listeDtoNomIdentifiants) {

        List<INomIdentifiant> listeNomIdentifiants = null;

        if (CollectionUtils.isNotEmpty(listeDtoNomIdentifiants)) {

            listeNomIdentifiants = new ArrayList<INomIdentifiant>();

            CollectionUtils.collect(listeDtoNomIdentifiants, getTransformerDtoNomIdentifiant2INomIdentifiant(),
                            listeNomIdentifiants);
        }

        return listeNomIdentifiants;
    }

    /**
     * @return transformer DtoNomIdentifiant -> INomIdentifiant
     */
    private Transformer getTransformerDtoNomIdentifiant2INomIdentifiant() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoNomIdentifiant dtoNomIdentifiant = DtoNomIdentifiant.class.cast(input);

                INomIdentifiant nomIdentifiant =
                                DTONomIdentifiantBuilder.dTONomIdentifiant()
                                                .buildIdentifiant(dtoNomIdentifiant.getIdentifiant())
                                                .buildNom(dtoNomIdentifiant.getNom())
                                                .buildObjectifs(buildListeObjectifs(dtoNomIdentifiant.getObjectifs()))
                                                .buildProduits(buildListeProduits(dtoNomIdentifiant.getProduits()))
                                                .build();

                return nomIdentifiant;
            }
        };

        return transformer;
    }

    /**
     * @param listeDtoNomObjectifs liste DtoNomObjectifs
     * @return liste INomObjectifs
     */
    private List<INomObjectifs> buildListeObjectifs(List<DtoNomObjectifs> listeDtoNomObjectifs) {

        List<INomObjectifs> listeNomObjectifs = null;

        if (CollectionUtils.isNotEmpty(listeDtoNomObjectifs)) {

            listeNomObjectifs = new ArrayList<INomObjectifs>();

            CollectionUtils.collect(listeDtoNomObjectifs, getTransformerDtoNomObjectifs2INomObjectifs(),
                            listeNomObjectifs);
        }

        return listeNomObjectifs;
    }

    /**
     * @param listeDtoNomProduits liste DtoNomProduit
     * @return liste INomProduit
     */
    private List<INomProduit> buildListeProduits(List<DtoNomProduit> listeDtoNomProduits) {

        List<INomProduit> listeNomProduits = null;

        if (CollectionUtils.isNotEmpty(listeDtoNomProduits)) {

            listeNomProduits = new ArrayList<INomProduit>();

            CollectionUtils.collect(listeDtoNomProduits, getTransformerDtoNomProduit2INomProduit(), listeNomProduits);
        }

        return listeNomProduits;
    }

    /**
     * @return transformer DtoNomObjectifs -> INomObjectifs
     */
    private Transformer getTransformerDtoNomObjectifs2INomObjectifs() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoNomObjectifs dtoNomObjectifs = DtoNomObjectifs.class.cast(input);

                INomObjectifs nomObjectifs =
                                DTONomObjectifsBuilder.dTONomObjectifs()
                                                .buildIdentifiant(dtoNomObjectifs.getIdentifiant())
                                                .buildNom(dtoNomObjectifs.getNom()).build();

                return nomObjectifs;
            }
        };

        return transformer;
    }

    /**
     * @return transformer DtoNomProduit -> INomProduit
     */
    private Transformer getTransformerDtoNomProduit2INomProduit() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DtoNomProduit dtoNomProduit = DtoNomProduit.class.cast(input);

                INomProduit nomProduit =
                                DTONomProduitBuilder.dTONomProduit().buildIdentifiant(dtoNomProduit.getIdentifiant())
                                                .buildNom(dtoNomProduit.getNom()).build();

                return nomProduit;
            }
        };

        return transformer;
    }
}
